上一篇,我和 Codex 從空 GitHub repo 建立了 LINE Bot 骨架,並用 Location Action 取得乾淨的 latitude 與 longitude。
這一篇終於要讓 Bot 開始「看地圖」了:
如何把位置交給 Vertex AI Google Maps Grounding,產生有來源的咖啡廳推薦?
這一段比我原本想像中更曲折。我們做到一半才發現 API 入口應該換成 Vertex AI,而且這不只是把 API key 刪掉而已,連 client、認證、參數位置與 response 格式都要重新確認。
第一版原本參考 Gemini API Maps Grounding 文件,採用 API key 與 Interactions API。
後來我指定另一份 Google Cloud 文件,並明確要求:
要走 Vertex AI,不要使用 Gemini API key。
這不是把 API_KEY 那一行刪掉就結束。Codex 重新比對了整條呼叫方式:
interactions.create 與 models.generateContent 的差異接著它直接查看已安裝的 @google/genai TypeScript declarations,確認 SDK 真正支援:
googleMaps?: GoogleMaps;
toolConfig?: ToolConfig;
retrievalConfig?: RetrievalConfig;
groundingChunks?: GroundingChunk[];
這次讓我很有感:Codex 不只看網頁文件,還會回頭檢查我電腦裡真正安裝的 SDK 版本。畢竟網頁可能是最新版,但專案裡的套件不一定完全一樣。
用白話說,文件像使用說明書,TypeScript declarations 則像手上這台機器真正有哪些按鈕。兩邊都對上,寫下去才安心。
最後 client 改成:
import { GoogleGenAI } from '@google/genai';
const ai = new GoogleGenAI({
enterprise: true,
project: process.env.GOOGLE_CLOUD_PROJECT,
location: process.env.GOOGLE_CLOUD_LOCATION || 'global',
apiVersion: 'v1'
});
環境變數也不再需要 GEMINI_API_KEY:
GOOGLE_CLOUD_PROJECT=your-project-id
GOOGLE_CLOUD_LOCATION=global
GEMINI_MAPS_MODEL=gemini-2.5-flash
GEMINI_TRANSLATION_MODEL=gemini-2.5-flash
Codex 同步修改了:
.env.example
.env
這就是整合型修改和只改一小段 code 的差別。
如果只改 client,README 還在叫人填 API key,下一次連我自己都可能被搞混。
位置查詢的核心如下:
const response = await ai.models.generateContent({
model: 'gemini-2.5-flash',
contents: [
'Find 3 to 5 good cafes near the supplied user location.',
'Prioritize places practical for sitting down with a laptop.',
'Do not invent outlet, Wi-Fi, time-limit, or noise information.',
'Keep the answer concise and respond in English.'
].join(' '),
config: {
tools: [{ googleMaps: {} }],
toolConfig: {
retrievalConfig: {
latLng: { latitude, longitude },
languageCode: 'en_US'
}
}
}
});
程式看起來不少,但核心其實很單純:把使用者的 latitude、longitude 放進 latLng,再告訴模型可以使用 Google Maps。
Prompt 裡我特別保留一句:
沒有資料時,不要自行宣稱有插座、Wi-Fi、不限時或安靜。
這些條件很適合咖啡廳推薦,但不一定存在於每間店的 Maps 資料裡。
Codex 在這裡沒有幫我把答案硬補得很漂亮,反而替 prompt 畫了一條線。對這種有地圖資料的產品來說,少說一點,通常比很有自信地猜更好。

這一篇先完成了 Maps Grounding 的核心呼叫:
retrievalConfig.latLng
此時 Bot 已經能把 LINE 傳來的經緯度交給 Vertex AI,並取得附近咖啡廳的英文推薦與 Grounding metadata。
但「模型有回答」還不等於「使用者拿到好用的答案」。下一篇,我們要把英文推薦安全地翻成繁中、把 Maps 來源做成 LINE 卡片,並處理一個只有真實呼叫才看得到的問題:五個來源,可能根本不是五間店。
👉 GitHub:https://github.com/zonawang/line-map-grounding
👉 更多 AI × LINE Bot 實作:https://github.com/zonawang/zona-ai-learning-lab